package com.pubinfo.passbook.engine.process.variable.medicine;

import com.pubinfo.passbook.common.entity.TEnginePlaceholderConst;
import com.pubinfo.passbook.common.model.dto.witeoff.MedicineOnJobOrRetireDTO;
import com.pubinfo.passbook.common.model.ruler.PayInformation;
import com.pubinfo.passbook.common.service.engine.EngineComputePlaceHolderConstService;
import com.pubinfo.passbook.common.utils.ApplicationContextUilts;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.CollectionUtils;

import java.math.BigDecimal;
import java.util.List;

/**
 * 泰顺不同级别医院起付标准参数处理器
 * <p>
 * 默认情况, 该参数处理器会优先读取常量占位符表中名**包含**:
 * ["温州市泰顺一级医院起付线" "温州市泰顺二级医院起付线" "温州市泰顺三级医院起付线"] 名称的常量占位符来返回不同级别医院起付线值.
 * 如果不存在该些常量, 则默认使用该类中默认的起付线. 分别为一级医院200, 二级医院300, 三级医院600
 *
 * @author zhouch
 * @date 2022/2/15 10:53
 */
@Slf4j
public class TaiShunStartPaymentProcessor extends MedicineVariableProcessor {

    // 泰顺一级医院
    private static final BigDecimal ONE = new BigDecimal(200);

    // 泰顺二级医院
    private static final BigDecimal TWO = new BigDecimal(300);

    // 泰顺三级医院
    private static final BigDecimal THREE = new BigDecimal(600);

    // 泰顺二级医院起付线常量占位符包含名称
    private static final String ONE_CONST_NAME = "温州市泰顺一级医院起付线";

    // 泰顺一级医院起付线常量占位符包含名称
    private static final String TWO_CONST_NAME = "温州市泰顺二级医院起付线";

    // 泰顺三级医院起付线常量占位符包含名称
    private static final String THREE_CONST_NAME = "温州市泰顺三级医院起付线";


    EngineComputePlaceHolderConstService constService;

    public TaiShunStartPaymentProcessor() {
        constService = ApplicationContextUilts.getBean(EngineComputePlaceHolderConstService.class);
    }

    @Override
    public BigDecimal get(MedicineOnJobOrRetireDTO data) {
        List<PayInformation> payInformations = cache.getPayInformationData();

        //获取最高级的报销金额
        BigDecimal startPayments = BigDecimal.ZERO;
        if (CollectionUtils.isEmpty(payInformations)) {
            return startPayments;
        }
        for (PayInformation payInformation : payInformations) {
            String startPayment = payInformation.getOrgType();
            if (startPayment.contains("一级")) {

                List<TEnginePlaceholderConst> constants = constService.likeName(ONE_CONST_NAME);
                if (!constants.isEmpty()) {
                    if (constants.size() > 1) {
                        log.warn("TaiShunStartPaymentProcessor[泰顺不同级别医院起付标准参数处理器]: 查询到有多个'{}'常量占位符, 注意检查计算是否错误."
                                , ONE_CONST_NAME);
                    }
                    // 有多个的话, 默认取查询到的第一个
                    return constants.get(0).getValue();
                }

                // 否则返回默认
                return ONE;
            } else if (startPayment.contains("二级")) {

                List<TEnginePlaceholderConst> constants = constService.likeName(TWO_CONST_NAME);
                if (!constants.isEmpty()) {
                    if (constants.size() > 1) {
                        log.warn("TaiShunStartPaymentProcessor[泰顺不同级别医院起付标准参数处理器]: 查询到有多个'{}'常量占位符, 注意检查计算是否错误."
                                , TWO_CONST_NAME);
                    }
                    // 有多个的话, 默认取查询到的第一个
                    return constants.get(0).getValue();
                }

                return TWO;
            }
        }

        // 如果到这里未查到起付线, 默认返回三级起付线
        if (startPayments.compareTo(BigDecimal.ZERO) == 0) {
            List<TEnginePlaceholderConst> constants = constService.likeName(THREE_CONST_NAME);
            if (!constants.isEmpty()) {
                if (constants.size() > 1) {
                    log.warn("TaiShunStartPaymentProcessor[泰顺不同级别医院起付标准参数处理器]: 查询到有多个'{}'常量占位符, 注意检查计算错误."
                            , THREE_CONST_NAME);
                }
                // 有多个的话, 默认取查询到的第一个
                return constants.get(0).getValue();
            }
            return THREE;
        }
        return startPayments;
    }
}
